移动距离

题目 移动距离

image-fe110884

思路分析

模拟案例可以发现规律

image-c6955978
#include<bits/stdc++.h>
using namespace std;

int main(){
    int w,m,n;
    cin>>w>>m>>n;

    int zong1=m/w;
    // cout<<"zong1: "<<zong1<<endl;
    int heng1;
    if(zong1&1)
        heng1=(w-(m%w)+1)%2;
    else
        heng1=m%w;
    // cout<<"heng1: "<<heng1<<endl;

    int zong2=n/w;
    // cout<<"zong2: "<<zong2<<endl;
    int heng2;
    if(zong2&1)
        heng2=(w-(n%w)+1)%2;
    else
        heng2=n%w;
    // cout<<"heng2: "<<heng2<<endl;

    cout<<abs(heng2-heng1)+abs(zong2-zong1);
    return 0;
}

这样无法兼顾两边的情况 一直加补丁 一直出现新问题

列从0开始计数 偶数情况会出现-1变负 列从1开始计数 奇数情况会出现超过大小 得再取个模

究其原因是因为 数据是从1开始的 要把它变成从0开始 问题就解决了

image-4795c659

移动距离

代码实现

#include<bits/stdc++.h>
using namespace std;

int main(){
    int w,m,n;
    cin>>w>>m>>n;
    m--,n--;

    int col1=m/w;
    int row1=m%w;
    if(col1&1)
        row1=w-1-row1;

    int col2=n/w;
    int row2=n%w;
    if(col2&1)
        row2=w-1-row2;

    cout<<abs(row2-row1)+abs(col2-col1);
    return 0;
}

同类题型

视频讲解


⬅️ 暴力 枚举 模拟 问题 🏠 00-刷题理模型 ➡️ 蹄子剪刀布